package com.hoe.tsb.mmk;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * Multi-Merkle树
 * </p>
 *
 * MMK的序列化和反序列化
 *
 * @author hoe
 * @version 1.0
 * @date 2022/11/24
 */
public interface Mmk<T> {

    /**
     * 获取计算出的Root Hash
     * @return Root Hash
     */
    String getRoot();

    /**
     * 根据叶子节点hash获取数据
     * @param leafHash 叶子节点的hash值
     * @return Root Hash
     */
    T getData(String leafHash);

    /**
     * 获取SPV路径<br/>
     * 根据传入的数据找到该数据的SPV路径<br/>
     * 验证者只需要计算出该数据的Hash，然后依次和List中的Hash进行合并Hash计算<br/>
     * 最后的计算结果和Merkle Root相等
     * @param t 需获取SPV路径的元素
     * @return SPV路径，如果数据不存在于该树中，则返回空集或null
     */
    List<String> getSpvPath(T t);

    /**
     * 判断Merkle树是否包含某条数据<br/>
     * 必须叶子节点包含该数据且根Hash相等才认为包含
     * @param root 根hash
     * @param t 待判断的数据
     * @return true包含，false不包含
     */
    boolean contains(String root, T t);

    /**
     * 简单判断Merkle树是否包含某条数据<br/>
     * 无需判断根Hash是否一致
     * @param t 待判断是否包含的数据
     * @return true简单包含，false不包含
     */
    boolean simpleContains(T t);

    /**
     * 获取区块中的数据Map
     * @return 包含区块中所有溯源数据的Map
     */
    Map<String, TraceData> getLeafDataMap();

}
